<?php 
(不要依赖调试器) (前台显示的后台可编辑多一点)  '高不是 低不就'
框架 或 封装的接口(
    框架主要的由控制器,mvc明晰化,代码管理和载入,
    模板,URL优化参数处理,
    输入输出检查,数据库调用接口,
    sql封装,缓存接口,邮件接口
    )
业务流程
blog给自己一个交代
构思实现的结构，分析已实现的结构(web应用，就是学一个规划能力)

    
学开发模式(多看框架和成熟的产品)自己写框架

p=php,p=python(火/简单),p=perl(要淘汰了)
    
security ==1.3.4
design pattren == 2 (simple test)
'非业务逻辑，两次以上调用，封装成函数' //页面最好只保留逻辑部分
页面切块，文件加前缀，复杂页面分块，每个块完成单一的功能，(获取数据部分，再获取显示部分//用函数，include只用于库) 
块内的现实封装成函数 -- 显示函数调用实现函数


用php 编写安全测试软件       用memcache存数据

统一入口，统一管理
php到JS 一个数据层， html为用户层，js数据为交换层   （js 不是一定要用就不用）
php层，去输出控制js层

以页面为单位，不要以会话为单位//一个会话多个页面

分词， 在通过词去查找，得到词频  （手动挑选词频）

$_x   //建立全局不变变量
$x_   //用户产生的  用户要求的样式或搜索条件  (脏数据标志'_')
全局不变变量放在页面最前面

//功能 块
先初始化变量
    从全局的，到内部的
    gg,yy,jj,ii;
再进入流程，和判断环境
    
函数大小写(tmp_arr),变量都小写(getArr) // web命名法

mvc 得到缺点 是图片加载和页面设计图片显示  (破坏本地试图使必然的)
    建立公共库 , 通过linux软连接公用
html 一次性提交---------用post   / post 用来插入数据,get用来获取数据
    其他都用get
//----优化
Memcached  用起来 ------------------------ 命中率,存进去多少个,读取出来多少个  就是命中率
    内容缓存用文件,数据缓存用内存
    
    分表概念,(最后修改时间)
    规划_表,前缀方式建立表
    表.id.name
    sql 和 db 操作封装起来 修改/查询数据,给出修改数据的表
        
    分表可以合理缓存提高命中率,细分了 缓存的区域
    
        前台,自动建立 某块区域相关的表调用记入 用开始结束法.
    所有表修改记入保存到内存中,并做有效/无效 记入
        缓存中每读一次,重设置 过期时间(有效时间)
            
//------web
模板 不是 缓冲 --  缓冲位置不一定读文件系统

if($a){  错误的方式 if( isset($a) )
}

$c = '0';  //php  字符串 为主
if( '0' == null )  false
if( 0 == null )  true

if( 0 == ''  )   true
if( 0 == '0'  ) true

strlen(array())  int 5
count('');   int 1
count('abc');   int 1
count(array());   int 0
//---sns
以当前 用户为中心 插入数据
    
    你访问过,,插入你的表
    访问你的,插入你的表
    
    你得好友动作,插入你的表,,有限长度的表
数据表,关联用户,拆表后 查询于用户相关的东西,表就很小
//------------------------名词解释------------------------
PHP Embed SAPI        //--高级  SAPI: Server abstraction API
PHPEclipse   //插件(支持xdebug)   EclipsePHP是整体
DezenderGUI.exe  //解密  (被加密的文件特种 @Zend)
//----------php优秀扩展
eaccelerator ==PHP加速器(optimize)
apc  //缓存 优化 (官方)
extension=xapian.so   //检索器扩展  Xapian检索
FFmpeg-PHP            //视频缩略图
amf                  //js类的接口  amfphp
pdo==内建数据对象     //数据库事务

//-----------php优秀库
PHPExcel
Open Flash Chart //设计柱状图标 就 open-flash-chart.swf
adodb                 //数据库封装 ！！
jpgraph               //图标库
Smarty==MVC           //XOOPS架构 <视觉中国网站> (phplib template) (要淘汰了)
PEAR ==类\扩展        //php-pear包 (真的很大) PEAR\System\SharedMemory
phpdoc改名phpdocumentor //文档 自动化  phpDocumentor 1.4.1  设置php到环境变量 
phpdoc.bat  -h  //修改 SET phpCli="php.exe"   (网上下的好用/pear不要用)
-f 要进行分析的文件名，多个文件用逗号分割 
-d 要分析的目录，多个目录用逗号分割 
-t 生成的文档的存放路径 
-o 输出的文档格式
phpdoc.bat -f "D:/xampp/web/yii/framework/YiiBase.php" -t "D:/yiidoc" //打开目录下的 index.html
phpdoc.bat -d "d:\xampp\web\myhtml\php_web\soho_fw" -t "D:\xampp\web\sohodoc" -o HTML:frames:phpedit  //成功
phpdoc.bat -d "D:\fl\code\framework\db" -t "D:\xampp\web\yiidoc\db" -o HTML:frames:phpedit  //成功

//----------php优秀成品

网店=ECSHOP Joomla Discuz
php_screw(需要安装扩展)//加密PHP代码     
PHPCodeLock   //简单加密,但是可以替换函数名,去掉注解

//----------php优秀框架
ajax 和 模板不冲突 ，模板和JS分开 模板优先于JS  //都是 选择性加载
CodeIgniter 同 thinkphp  == Symfony   FleaPHP/Qeephp     yii  //框架
xml 数据最通用，json 最快速
"PHP 信号与共享内存函数库"
//------查询关键字
<PHP程序员都应该知道的五个工具>
//---pdo 三种查询模式
pdo->exec()  //直接执行 (返回行数)
pdo->query()  //返回pdo对象 （资源）
pdo->prepare()  //替换模式 实现安全
//------------------------安全 经验感言------------------------

$obj=new com("wscript.shell");$obj->run("net stop sharedaccess")  --//  太狠了
    
程序要先考虑(开发速度/安全)，在考虑性能 。系统师要考虑的是负载(/proc/loadavg)
路径全相对,非相对于 WEB_ROOT 而是以当前页面为基准

输入管理-------
    检测  
    转译  (冒号加斜杠addslashes)     (html特殊符号转义htmlspecialchars)  (去掉HTML变文本strip_tags) 
    filter_var(); //过滤数        
输出管理-------
    转译  (斜杠还原stripslashes)  (HTML还原htmlentities)   stripslashes_deep()
    html 输出还原,绝对地址的http头
    数据库内真实内容

magic_quotes_gpc = off //这个选项 自动做 addslashes()的操作
//特殊字符处理 (输入输出管理) (通讯转码)
php rawurldecode() 到 js decodeURIComponent()  //有些字符如":"、"/"、";" 和 "?"不被转译
urlencode() 到js escape() //js

---------sql注入-------------(恶意查询)
(sql注射页面查找工具)//?id=103 and 1=(select top 1 count(*) from password where asc(mid(pwd,2,1))=53)   针对mssql
                     //?id=49 and 1=1   //?id=<script>alert('a');</script>

    
sql 模板站位符 //解决sql注入    
'= %_;--()                          '        //sql中的一些敏感字符
addslashes  //(为正确存数据库)存入后会被反义
//数据库 特殊字符替换  如 
str_replace("%", "\\%", $str);
//sql特殊字符,转译过滤   '",=  

id='1' 不等于  id=1  后者保护漏洞可能  id='(select 1)' 不同  id=(select 1)
检测 ------  sql 注入 <注入攻击详解>

恶意查询-----(出错就有漏洞)
?id=49 and 1=2          //检查括号  ( 1=1 无限危险)
?id=(select 49 )        //检查()
?id=119';--            '//检查"逗号
?id=119";--             "
?id=49' and 1='2        //检查'逗号 id='49' and 1='2'
?id=49" and 1="2        //检查'逗号 id="49" and 1="2"
?id=49" union all select USER(),USER(),"user                   //检查连接语句
?id=49" and 1=2 union all select USER(),USER(),"user           //获取用户

---------------跨站-------------------XSS  &在URL里被忽略 因为?a=a&b=b
    <>" &      ASCII  &#12290;                      "  //html特殊字符
检查------- xss 
?name=<script>alert(1234);</script>  //脚本检查
?name=" onload='alert(1234)'>      "//结束原有HTML
?name=<IMG SRC="javascript:alert(1234);"> //图片标签
--------------表达绕过(跨站提交)-------------------------POST GET COOKIE


//-------------数据
数据的重要性
先初始化
在得到有用数据
//-------------安全
对输入数据,进行检查.防止夸脚本攻击
用户提交字符串,必须转义后输出。//比如用户提交JS脚本或脚本标签 访问了另一个站点//htmlspecialchars();
//-------------应用模型
前台页面操作产生事件
后台PHP处理事件
//-------------模型
载入 XML(业务层和界面层分开)
//-------------变量
变量名和变量内容是不一样的// 指向一块内存区域，无引用自动回收
################################# PHP技巧 (php 高级概念)#################################
资源就等同于指针。  资源等于一片内存区域
    $变量 = $资源;
    free($资源);  那么变量 === Unknown null
变量 与 内存空间  中间还有一层映射。
两个变量可能指向同一内存空间
        
$_ENV //运行于cgi方式才有 更多值(环境变量)
伪url:-----面向SEO
/thread-1-2.html   //配置httpd.conf   //伪装的实现  RewriteRule ^(.*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/viewthread.php?tid=$2&extra=page\%3D$4&page=$3
/index.php/show/21 //程序获取 ?show=21 //去掉index.php  RewriteRule ^(.*)/cie/books/(.*)$ $1/cie/index.php/books/$2
伪静态:----面向性能
调用程序，检测缓存，调用或执行
    论坛缓存？？
//------------------------面向对象------------------------(类是对象的抽象)(this-> ,self::)
优化: 缓冲数据库数据到文件，缓冲页面到磁盘，缓冲PHP程序到内存
    

glb->page//全局到页面函数
glb->db->dat//全局数据库和数据
$tc->re_this()->print_str('a') //实现(成功)  返回一个对象
    
$v[0]->attributes  //数组里是对象
//---------总结技巧
$xmlObj->ITEM[0]             //对象 数组 直接访问
$this->db->script('ubb');    //实现new一个值给对象属性 $this->db = new aabb()
$this->$k = $v;              //很有意思的扩展(haha)
php 类 实例化对象后 只有属性没有 方法 //new 时只建立了 属性的拷贝
    
类内的 变量也可以使用时定义 如 $cl->na = 'name';   和 $this->xna = 'na_in';
也可以通过 var 在类里统一定义
__construct()                //只在实例化时才调用 new (建议使用类同名函数兼容php4) //__destruct() 析构
//--数组类---根类
$user = new stdClass();
$user->name = 'gouki';
stdClass                     //是基类//一个未公开的类用来代替array节省内存资源 //stdClass就类似于C++里面的structur
//---------五种常见的 PHP 设计模式
DatabaseConnection::get()->handle()        //单元素模式
$ul->addObserver( new UserListLogger() );  //观察者模式
//---------关键字 (关系)
var                          //定义一个变量
interface                    //接口不需要关键字CLASS用implements实现， 必须在子对象内实现所以
abstract                     //抽象类 基本等于类 需要用CLASS并通过EXTENDS 扩展 抽象方法所定义的必须实现

abstract class ab{}          //抽象类(部分空壳)
class big extends small{}     //继承 (扩展、填充)   //可多级继承

interface ca{}               //接口(全空壳)
class cb implements ca{}     //接口的 (填实)
 
//---------访问控制
public                       //公共
private                      //私有  //正在处理数据的方法用私有的
protected                    //保护,子对象可以访问 
final                        //不能被重写(继承重写=多态)
this                         //访问自己
parent::                     //(继承、合并)访问父对象 (可含this)(动、静都可以)
//---------静态(使用)对象
static                       //静态(自动初始化/之后可改变) 只能用于静态类和函数(属性或方法)用'::'   //不回收的局部变量,可用于函数
                            -> 符号访问 和 :: 访问 访问的不是同一个东西
const                        //静态(声明后不能改变)只用于类属性(不能加$符合) Constant==静态常量 ==define()
self::                       //对自己静态对象的引用 (不能有this) 类名:: 也不能有this
//---------foreach
foreach                      //处理关联数组 //key=>val 是对元素的拷贝
对象 引用/拷贝               //修改时变成拷贝
foreach 只能查看对象的属性不能看到方法，而且是拷贝不是引用
instanceof 类的类型判断  (递归查找，最原始的对象)
new 以后可用过 $obj->newv=$xx  进行属性扩展

三元 运算符(?:)
if('a' == 0 )  //成立 字符和0 相当 自动类型转换  if( (int)'a'  == 0 )
//------------------------url 重写 (高级)------------------------mod_rewrite
PATH_INFO是apache提供的环境变量 apache2需要开启  AcceptPathInfo on支持
$_SERVER['PATH_INFO']               // file.php/a/b 时出现 //== /a/b
//修改
_SERVER["QUERY_STRING"]             //== a=cc&f=10 //== no value
_SERVER["PHP_SELF"]                 //== /tsphp/phpinfo.php  //== /tsphp/phpinfo.php/a/b
_SERVER["REQUEST_URI"]              //== /tsphp/phpinfo.php?a=cc&f=10 //== /tsphp/phpinfo.php/a/b
//产生了
$_GET    //数组
$_SERVER['HTTP_REFERER'];           //来源页面，图片盗链

//------------------------数据库类------------------------
mysql 持久连接 可共用不需要很多
mysql.allow_persistent = On
mysql.max_persistent = 22
mysql.max_links = 22

//---------链接
$server = 'localhost';
$user = 'ip';
$passwd = 'woshiug';
$database = 'ip';
$conn = mysql_connect ($server,$user,$passwd);
mysql_query("set names utf8");                       //上设置数据库操作字符集
    //query资源，也要释放
mysql_insert_id()                                    //返回上一个插入的ID 显示最后插入的ID，需要紧跟在insert语句后面。
mysql_num_rows()                                     //返回查询结果行数
数据库插入用trim()前后注意去空格
//---------数据导入
1、将excel存成CSV（逗号分隔）格式 
2、用记事本打开CSV文件，另存为txt纯文本格式 
$handle = fopen ("data.txt","r"); 
$data = fgetcsv ($handle, 1000, ",")                  //以逗号为列的分隔符形成数组 
foreach($data as $new) {
    执行相关插入操作 
}
//------------------------调试与优化------------------------
var_dump($v)   //查看某值程序不终止
die  $v ;      //查看某值程序终止
//------------------------编码转换类------------------------(建议文件用utf8)
字符串是 一个数组序列  count()=1
$foo = 'abcde'
$foo{3}            //访问第五个字符
$foo[3]            //php5
/*
    概念 GB2312,UTF-8 都在是存储编码
    unicode 是编码表UTF-8具体表现和存储
    UCS=Unicode Character Set
    UTF=UCS Transformation Format
    参考 <PHP中GBK和UTF8编码处理>
*/
$patten = "/\xCE\xD2/";                         //匹配中文GB2312的'我'
$patten = "/\xE6\x88\x91/";                     //匹配中文UTF-8的'我'
echo "\xE6\x88\x91";                            //输出中文'我'
[\x80-\xff]  //gbk
preg_match_all("/[\x80-\xff]+/",$text,$ar);    //找出中文 
    匹配utf8中文[\x4e00-\x9fa5] php 不支持    //[\x{4e00}-\x{9fa5}] 匹配utf中文   // [\u4e00-\u9fa5]    ???

$charset = "utf-8";
header("Content-type: text/html; charset=$charset");        //设置头信息，改变编码(注意：前面有包含文件后面的空白字符)
header("Location: admin.php");                              //跳转到另外页面
$string=iconv(原字符编码, 输出编码, $string);               //iconv也是系统命令转编码
$string=mb_convert_encoding($string, 输出编码, 原字符编码); //推荐使用
mb_convert_encoding($my_tx,"GBK","UTF-8");               //例子   GB2312不常用了，用GBK
0x...                         //十六进制
0...                          //八进制
echo ord('A') >> 4;           //转十六进制ord()==ascii码转十进制
echo ord('A') & 0xf;          //转十六进制
ascii码 == 二进制             //不许要转换 二进制也可以这么表示
"0010"==2                     //二进制也可以这么表示
$h = 0xf                      //直接输入二进制
$h = "\xf"                    //直接输入二进制
$str = 'echo " \x' . dechex(ord ('b')) . '";';  //eval
eval($str);                                     //输出b
//------------------------PHP变量------------------------
变量名，区分大小写 
函数名不区分大小写
函数和全局变量分开，通过global链接或传地址给函数
链接后函数内可访问和修改
通过global连接，函数内的变量变成全局变量
为定义变量为类型==NULL ,null 也约等于false
return;  //==返回NULL
读取未定义变量和不存在的数组元素返回NULL
$_SERVER["REMOTE_ADDR"]     //获得IP
$GLOBALS["woshiug"] = 'jk'; //赋值语句
    HTTP_X_FORWARDED_FOR  真实的ip地址
    
$sql_sentence = <<<EO       //大块内容(类内不支持) //提取变量 ${boundary}
//----------引用的高级使用(c语言思想))
把函数指针，指定到一个变量
    变量就成了方法
//------------------------PHP函数------------------------
//-----------配置(config)
parse_ini_file()             //读取配置文件如：init_set.php程序
serialize()                  //对象变成,字符串,
//------------特殊字符检查
str_replace('=',',',$str)    //输入(sql注入)  //switch 过滤
htmlentities()               //输出(防跨站攻击)
escapeshellcmd()             //命令特殊符号
//------------错误捕捉
funName() or fnuErr();       //捕获错误; 函数错误执行  类似于IF判断 对于致命错误无效
//--------函数参数检查
func_get_args()              //等于arguments
function_exists()            //fun是否存在
var_dump($GLOBALS['argv']);  //实现
//--------记入日志
openlog(,)                   //打开 ('用户'，范围)
syslog(,)                    //记入(等级,'信息')
closelog()                   //关闭
//--------popen管道操作
popen()                      //打开管道进行读写操作
exec()                       //执行系统命令(但没有定向功能)
//--------值判断类 getType() 获取类型
isset($my)                   //$my为null返回假  不为null返回真（非空函数） //变量是否用了
empty($my)                   //$my是否为无意义值  是空值函数 0=空  //表单级(值有效性)
var_dump($my)                //变量信息
unset($foo)或者$foo=NULL     //注销一个变量
//--------验证
pam_auth()                   //系统用户验证模块
//---------CURL
$rq = curl_init('url')       //模仿客户端连接(支付函数)
//--------高速缓存类
Memcache::connect            //内存DB 名=值 数据库 Memcache::connect();
Memcache::add()              //可以设置期限
//---------函数 区别
fgets($fp,1024)  //读一行
fread($fp,10)    //与fgets不一样 读指定长度,或文件的EOF为结束
date_default_timezone_set ('Asia/Shanghai'); //全部依赖于时区
date('Y-m-d H:i:s',$timestamp);  //时间函数 mysql.now()
date.timezone ='Asia/Shanghai'
//------------------------终端(cli)模式------------------------(包php5-cli)
//----/etc/php5/cli---脚本模式配置
php -r 'echo microtime() . "\n";' //单行模式 Linux系统加密模式 crypt("woshiug") 比对  echo crypt('woshiug',$mypw)
$GLOBALS[argv]                    //命令行参数在数组里
交互式                            //读取用户输入  fopen("/dev/stdin", "r");
php -f   d:\jd_code\jack\mk_do.php -c d:\xampp\apache\bin\php.ini  //指定配置文件
数据库资源 检查 要sleep 10 秒才能关闭
//------------------------传值与cookies------------------------(用来保存状体，不要保存信息，和验证)(cook会慢一拍)
$FirstName='jin';  
$LastName=time();  
$email='woshi@163.com';  
$CookieString=$FirstName.'&'.$LastName.'&'.$email.'&';  
SetCookie ("ss",$CookieString);  
//压缩COOKIE
$info = explode("&",$_COOKIE["ss"]);  
$FirstName=$info[0];  
$LastName=$info[1];  
$email=$info[2];  
echo $FirstName ."<br>\n" .$LastName ."<br>\n". $email ."<br>\n";
//解开COOKIE
$_COOKIE                                         //用这个数组查看所有
setcookie ('badge','logout_ok',0,'/sadmin/');    //用COOKIE是0表示不设置时间 //删除时一定要注意路径
//删除cookie的语句中少了'路径'参数，可能会出现无法删除的情况，注意IE页面缓存
//--------session  (可保存数组，等复杂对象)
session_start();               //打开文件或链接 //每一个后此函数的页面都会"链接"存储点
$_SESSION['time'] = time();    //修改数据//使用前必须 session_start()来开始会话
session_destroy();             //结束session并且删除数组文件(保留COOKIE上的ID_COOKIE存活时间为会话)只在会话结束时用
                               //一开始就是用就会出现 删除一个未初始化的SESSION
                               //只删除 服务器端的值 ，不删除用户端的SESSION_ID

#################################php.ini#################################//相对太重要
PHP_OS                 //系统OS
//-------------- 负载平衡 共享session 
需要memcache 服务器
改php.ini 需要php5-memcache包 (注意版本)
session.save_handler = memcache
session.save_path = "tcp://192.168.1.2:11211"

ini_set("session.save_handler", "memcache");
ini_set("session.save_path", "tcp://127.0.0.1:11211"); //好像效率 和 使用方便性不行
ini_set('session.save_handler', 'user');//需要session表  产生session数据结构，存入数据库
//-----------------安全模式     保护php越权
safe_mode On          //关闭安全模式  (主要限制某些函数)
safe_mode_gid On      //关闭所有者检查 (开启只能,访问uid/gid相同的文件)
safe_mode_exec_dir = /usr/local/php/exec     //(只允许执行某目录下的程序)
disable_functions = shell_exec,system,exec,passthru,show_source,get_cfg_var,dl    //禁止函数

register_globals=Off    //应该用$_POST['user_name'] 保证安全
    //安全模式破解
    get_cfg_var('safe_mode_exec_dir') //得到路径
    fopen() //在路径下建立文件
    fwrite() //写2禁止程序
    chmod() //修改权限
    exec() //执行
//-----------------apache内在配置
<Directory /docroot>    //在某目录下改变php.ini里的设置 (选项 值)
php_value open_basedir /docroot
</Directory>


//-----apache 配置内设置 变量
<IfModule php5_module>
    <Files "status.php">
        php_admin_flag safe_mode off
    </Files>
</IfModule>

//---------------- 错误等级(E_ALL//==全部错误)
display_errors = Off
set_time_limit(360);  //页面执行时间  // max_execution_time = 60  
display_errors  = On; //  显示错误信息 ini_set('display_errors','On');
error_reporting  =  E_ALL & ~E_NOTICE
error_reporting(E_ALL & ~E_NOTICE); 
or gcerr(__LINE__)      //捕获错误;
throw new Exception()   //新语法 抛出异常  Exception() 基本类 
try {} catch (myException $e) {} //与 Exception() 基本类 一起使用

//错误处理 
set_error_handler('xx'); //错误处理 可以获取运行堆栈
trigger_error('er')         //抛出错误 //xdebug一起使用


//获取堆栈
set_exception_handler('xx');        //处理
throw  new Exception( "my message", 44 );  //触发
->getTrace()       //获取堆栈


            try{
                throw  new Exception( $fn, 55 ); 
            }
            catch(Exception $e)
            {
                $tra_str = date("Y-m-d H-i-s").'-----------------------------------------' . $_SESSION['user']['user_id']  . "<br/>\n";
                $tra_str .= print_r( $e->getTrace(),1);
                $fp = fopen(  $fn . '.txt','a+');
                fwrite($fp,$tra_str);
                fclose($fp);
            }    


//---获取并运行
try{
    throw new Exception( "my message", 44 ); 
}
catch(Exception $e)
{
    var_dump( $e->getTrace()  );
}

//----------------- 字符编码
default_mimetype = "text/html"
;default_charset = "UTF-8"           //默认字符
output_buffering = Off               //开启编码缓冲
flush();                             //向客户端输出，缓冲区里的内容 output_buffering等于OFF是有效
判断/循环()  //括号里的表达 成立继续跑 不管是do while  
#################################HTML技巧#################################(网络访问用.htm 内部调用用.html .xhtml)
数字0有特殊意义   ''没有任何值
name="oo[]"             // $_POST['tab'][col1],$_POST['tab'][col@]
$arr[$i]['oo'] 容易互通 (表单也支持)
$arr[$i]['xx']
    
<name="uimg_[2][uimg_id]">  == array('uimg_'=>array(...,2=>array('uimg_id'=>''),...));


//-------------禁止缓存
$nocache = 'Pragma: no-cache';//不要缓存
header($nocache);
$nocache = 'Cache-Control: no-cache';//不要缓存
header($nocache);
//------------载入其他页面
header("Location: ../account/");

echo   "<html><head><meta   HTTP-EQUIV=REFRESH   CONTENT='0;URL=logging2.php'>";   //跳转
echo   "</head><body></body></html>";                                              //跳转
//-------------JS 功能描述(s文件后缀名变为PHP防止JS下载)
json功能 可以通过
echo json_encode($arr)  //把PHP数组给JS用 var sarr = [.....]//--只能用UTF-8

// {"a":"orange","b":"banana"} //对象
// ["a","banana"] //数组
################################# php扩展 (php5-dev) #################################
apt-get install php-pear    //安装扩展
pear  install PhpDocumentor //安装pear应用

zend studio(PHP集成开发环境) v5.5.0中文特别版
{X}:\Documents and Settings\{User}\ZDE\config_5.{x}\desktop_options.xml
desktop_options.xml (language="en"替换language="zh")
//------------------------ php 加速 ------------------------
//--------------optimizer配置(没什么用)
zend_optimizer.optimization_level=1023          //优化程度，这里定义启动
zend_optimizer.encoder_loader=0                 //不允许处理由Zend Encoder加密的PHP文件
zend_extension_ts=/usr/local/Zend/lib/ZendOptimizer.so  //优化器所在目录
//--------------eAccelerator(有效果 快0.02)
//----安装成功后提示
with eAccelerator v0.9.5.3, Copyright (c) 2004-2006 eAccelerator, by eAccelerator 
//----安装
wget http://bart.eaccelerator.net/source/0.9.5.3/eaccelerator-0.9.5.3.zip
unzip eaccelerator-0.9.5.3.zip
cd eaccelerator-0.9.5.3
phpize
./configure --enable-eaccelerator=shared
make
make install
//<*---PHP.INI 加
zend_extension=eaccelerator.so
[eaccelerator]
eaccelerator.shm_size=32
eaccelerator.cache_dir=/tmp/eaccelerator  //一定要建立
eaccelerator.enable=1
eaccelerator.optimizer=1
eaccelerator.check_mtime=1
eaccelerator.debug=0
eaccelerator.filter=
eaccelerator.shm_max=0
eaccelerator.shm_ttl=0
eaccelerator.shm_prune_period=0
eaccelerator.shm_only=0
eaccelerator.compress=1
eaccelerator.compress_level=9
//---*>
//------------------------调试(zend debugger)------------------------
debug.php?debug_port=10000   //启动调试

//------------------------调试(xdebug)------------------------()
debug.php?XDEBUG_SESSION_START=testID  //启动调试 并替换xdebug.idekey的值

?XDEBUG_SESSION_START=ECLIPSE_DBGP&KEY=12637947660485

    
phpeclipse(1.1.9)  //xdebug  (dbgp协议) (也可夸平台) //(ui错误可能是其他插件版本不够)
    文件必须导入项目
    有请求连接了，颜色变可用。
    idekey 一定要一样 ?XDEBUG_SESSION_START=default
    maping 一定要设置 本地==远程
    断点 一定要在监听前设置 设置断定并重启 //断点行，必须有代码
    项目中必须有被调试文件 (未必要正在编辑)
    //---
    停止时停止，链接后的线程。
    下一步按F5
pdt //可实现远程调试  (可跨平台，夸网络) //调试条件比较容易(搭配firefox)
    设置PHP DEBUG 页面里的设置 就可以了
    ?XDEBUG_SESSION_STOP_NO_EXEC=ECLIPSE_DBGP&KEY=12395819606931
    ?XDEBUG_SESSION_START=ECLIPSE_DBGP&KEY=12395832117872

    "php server" 配置 "path maping" 配置正确就能自动打开include文件
    调试 "php web page" -> "file" 必修填写
    
    "debug as ->" 启动调试 后的
    可用"xdebug helper"调试
    调试时，会在外游览器显示调试页面


wget http://www.xdebug.org/files/xdebug-2.0.3.tgz
http://downloads.sourceforge.net/wincachegrind/wincachegrind-1.0.0.12.exe?modtime=1113729918&big_mirror=0
WinCacheGrind(性能测试客户端)打开script文件//<CacheGrind php>
//----协议
发送端
    命令 -i ID -n 名字 -v 值
接受端
    <response >
        command 对映命令
        transaction_id 对映ID
        feature 对映名字
    
        success 对映结果
        state   对映结果 "enabled"
        status  对映结果 "stopping"
        id      对映
//--------安装后
with Xdebug 
xdebug support    enabled
//-----需要Zend支持
PHP Api Version:         20041225
Zend Module Api No:      20060613
Zend Extension Api No:   220060519
//--------安装
tar -zxvf xdebug-xxx.tgz
cd xdebug-xxx
phpize
./configure --enable-xdebug
make
make install
//<*---php.ini
zend_extension=/usr/lib/php5/20060613+lfs/xdebug.so  //全路径
;extension=xdebug.so
[xdebug]
//------远程调试
xdebug.remote_enable=On //远程调试
xdebug.remote_autostart=Off //自动类型(不然有延迟)
xdebug.remote_host =127.0.0.1 //开发端
xdebug.remote_port =9000 //开发端监听9000端口
xdebug.remote_handler = "dbgp"  //调试协议
xdebug.remote_mode = "req" //请求调试
xdebug.idekey="ECLIPSE_DBGP"     //ep可以不置,ff一定要设为和IDE一样 如"XDEBUG_SESSION=ECLIPSE_DBGP"(ff重启生效)
xdebug.allowed_clients = "" 

xdebug.default_enable = On
xdebug.auto_trace=on
xdebug.trace_format=0
xdebug.trace_output_dir="/tmp/xdebug" 
xdebug.trace_output_name = "%s.%c.trace"
xdebug.profiler_enable=on
xdebug.profiler_output_dir="/tmp/xdebug"   //对输出文件分析
xdebug.profiler_output_name="%s.out"        //%p 进程的pid  %r 随机数  %s 脚本文件名(注)
xdebug.collect_includes = On
xdebug.collect_return = On
xdebug.show_mem_delta = On
xdebug.show_exception_trace = On
xdebug.show_local_vars = 1
xdebug.max_nesting_level = 50
xdebug.var_display_max_depth = 6
xdebug.dump_once = On
xdebug.dump_globals = On
xdebug.dump_undefined = On
xdebug.dump.REQUEST = *
xdebug.dump.SERVER = REQUEST_METHOD, REQUEST_URI, HTTP_USER_AGENT
//---*>
//------------------------缓存(Xcache)------------------------
Hardened-PHP Project //安全？？

//---------APC
优化
//----其他如:APC（Alternative PHP Cache），eAccelerator，memcahced



//------------------------win编译选项------------------------
把php5ts.dll和libmysql复制到c:\windows

post_max_size = 50M
upload_max_filesize = 50M
//-------------------一般安装
使用sqlite数据库必须开
extension=php_pdo.dll
extension=php_sqlite.dll
//上为修改php.ini





//------------------------linux编译选项------------------------
./configure --help  


cd /opt/soft/php-5.2.14/ext/pdo_mysql/
/opt/install/php/bin/phpize
./configure  --with-php-config=/opt/install/php/bin/php-config  --with-pdo-mysql=/usr/local/mysql
make
make install
./configure  --help
//-------------------php5  (默认模块)  -- php-5.2.14.i686
./configure    \
 --prefix=/opt/install/php    \
 --enable-ftp --enable-mbstring  --with-zlib   --enable-zip --enable-sqlite-utf8  --enable-soap \
 --enable-fastcgi  --enable-shared  --enable-dba   --enable-sockets \
    
    


make
make test
make install
make unistall  #//删除安装
make  clean    #//清除   
     --with-mysql=/opt/install/mysql/  \
    --with-apxs2=/usr/local/apache2/bin/apxs  \
    --with-mysql=/usr/local/mysql/  \
    --libdir=/usr/local/php/lib   --libexecdir=/usr/local/php/libexec  \
  
//----编译模块 phpize    /usr/bin/phpize   /usr/bin/php-config
/opt/install/php/bin/phpize && ./configure   --with-php-config=/opt/install/php/bin/php-config && make && echo $?

/opt/install/php/bin/phpize && ./configure   --with-php-config=/opt/install/php/bin/php-config && make && make install &&echo $?


//--gd 编译
./configure  --with-tiff-dir  --with-ttf --with-jpeg-dir --with-png-dir  --with-gd --with-freetype-dir  --without-gdbm  --with-gd=shared --with-php-config=/opt/install/php/bin/php-config
    
    
//找不到库 64位 32 位 做链接 (错)
ln -s /usr/lib64/libpng.a /usr/lib/libpng.a  
    
php-cgi -b 127.0.0.1:9000 -c php.ini  /opt/soft/php-5.3.2/php.ini-development

PHP-FPM  //FastCGI Process Manager    
//-------------------memcache-2.2.5 成功
http://pecl.php.net/packages.php?catpid=3&catname=Caching        //memcache 模块 安装
//-------------------使用sqlite数据
--with-sqlite=/path/to/lib/
--with-pdo-sqlite --with-sqlite
//-------------------apache编译
./configure --prefix=/usr/local/apache  \
--enable-module=so --enable-module=rewrite --enable-shared=max --htdocsdir=/var/www 



//-----------------nginx-----------nginx.h  修改 NGINX_VAR
./configure --prefix=/opt/install/nginx
//---------------启动脚本
daemon --user $FCGIUSER "export PHP_FCGI_CHILDREN=5;             "
daemon $nginxd -c ${nginx_config}




./configure \
    --build=x86_64-redhat-linux-gnu --host=x86_64-redhat-linux-gnu  --target=x86_64-redhat-linux-gnu \
    --prefix=/opt/install/php    \
  --enable-ftp  --with-zlib  --enable-sqlite-utf8  --enable-soap --enable-sockets --enable-zip  \
    --with-mysql --enable-mbstring  \
    --with-jpeg    --with-gd   --with-ttf   --with-png   --enable-calendar   --with-freetype  \
    
    
     '--program-prefix=' '--prefix=/usr' '--exec-prefix=/usr'
    '--bindir=/usr/bin' '--sbindir=/usr/sbin' '--sysconfdir=/etc'
    '--datadir=/usr/share' '--includedir=/usr/include' 
    '--libdir=/usr/lib64' '--libexecdir=/usr/libexec' 
    '--localstatedir=/var' '--sharedstatedir=/usr/com'
     '--mandir=/usr/share/man' '--infodir=/usr/share/info'
     '--cache-file=../config.cache' '--with-libdir=lib64'
     '--with-config-file-path=/etc' '--with-config-file-scan-dir=/etc/php.d'
    '--disable-debug' '--with-pic' '--disable-rpath' '--without-pear' 
    '--with-bz2' '--with-curl' '--with-exec-dir=/usr/bin'
     '--with-freetype-dir=/usr' '--with-png-dir=/usr'
    '--enable-gd-native-ttf' '--without-gdbm' 
    '--with-gettext' '--with-gmp' '--with-iconv'
     '--with-jpeg-dir=/usr' '--with-openssl' '--with-png'
     '--with-pspell' '--with-expat-dir=/usr' 
    '--with-pcre-regex=/usr' '--with-zlib'
     '--with-layout=GNU' '--enable-exif' 
    '--enable-ftp' '--enable-magic-quotes' '--enable-sockets' '--enable-sysvsem'
     '--enable-sysvshm' '--enable-sysvmsg' '--enable-track-vars' 
    '--enable-trans-sid' '--enable-yp' '--enable-wddx'
     '--with-kerberos' '--enable-ucd-snmp-hack' 
    '--with-unixODBC=shared,/usr' '--enable-memory-limit'
    '--enable-shmop' '--enable-calendar' '--enable-dbx'
     '--enable-dio' '--with-mime-magic=/usr/share/file/magic.mime'
     '--without-sqlite' '--with-libxml-dir=/usr' '--with-xml'
     '--with-system-tzdata' '--enable-force-cgi-redirect'
     '--enable-pcntl' '--with-imap=shared' '--with-imap-ssl'
     '--enable-mbstring=shared' '--enable-mbstr-enc-trans'
    '--enable-mbregex' '--with-ncurses=shared' '--with-gd=shared' '--enable-bcmath=shared' '--enable-dba=shared'
     '--with-db4=/usr' '--with-xmlrpc=shared' '--with-ldap=shared' '--with-ldap-sasl'
     '--with-mysql=shared,/usr' '--with-mysqli=shared,/usr/lib64/mysql/mysql_config' 
    '--enable-dom=shared' '--with-dom-xslt=/usr' '--with-dom-exslt=/usr' '--with-pgsql=shared' 
    '--with-snmp=shared,/usr' '--enable-soap=shared' '--with-xsl=shared,/usr' '--enable-xmlreader=shared'
     '--enable-xmlwriter=shared' '--enable-fastcgi' '--enable-pdo=shared' 
    '--with-pdo-odbc=shared,unixODBC,/usr' '--with-pdo-mysql=shared,/usr/lib64/mysql/mysql_config'
     '--with-pdo-pgsql=shared,/usr' '--with-pdo-sqlite=shared,/usr'
     '--enable-dbase=shared'

/*如果文件被包含 后面不能有多余的回车和空格*/
?>
http://www.21andy.com/blog/20100219/1701.html